/*
    实现线程的第一种方式：
        编写一个类，直接继承java.lang.Thread，重写run方法

        怎么创建线程对象：new
        怎么启动线程：调用线程对象的start()方法

    获取线程对象的名字
        String name = 线程对象.getName();

    修改线程的名字
        线程对象.setName("线程名字");

    默认线程名字
        Thread-0
        Thread-1
        Thread-2

    获取当前线程对象？
        Thread t = Thread.currentThread();
        返回值t就是当前线程


 */
public class ThreadTest01 {
    public static void main(String[] args) {
        //线程名字，主线程名字叫做main
        System.out.println(Thread.currentThread().getName());

        //main方法，主线程，主栈运行
        MyThread myThread = new MyThread();
        myThread.setName("tttt");
        String name = myThread.getName();
        System.out.println(name);
        //启动线程
        //myThread.run();    //不会启动一个新的线程，不会分配新的分支栈（单线程）
        //start()方法的作用：启动一个分支线程，在Jvm中开辟一个新的栈空间，这段代码任务完成之后，瞬间结束
        //这段代码的任务只是为了开辟一个新的栈空间，只要新的栈空间开辟出来，start()瞬间结束，线程启动成功
        //启动成功的线程会自动调用run方法，并且run方法在分支栈的栈底部（压栈）
        //run方法在分支栈的栈底部，main方法在主栈的栈底部。run和main是平级的
        myThread.start();
        //这里的代码还是运行在主线程中
        for (int i = 0; i < 1000; i++) {
            System.out.println("主线程" + "--->" + i);
        }

    }
}

class MyThread extends Thread{
    @Override
    public void run() {
        //编写程序，这段程序运行在分支线程中（分支线）
        for (int i = 0; i < 1000; i++) {
            System.out.println("分线程" + "--->" + i);
        }
        //下面这段代码出现在哪，谁就是当前线程，谁调用了，谁就是当前线程
        //tttt就是当前线程的名字
        System.out.println(Thread.currentThread().getName());
    }
}